<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>闭包与函数作用域</title>
</head>
<body>

</body>
<script type="text/javascript">

	// function a(){
	// 		var aa=100;
	// 		function b(){
	// 			var bb=100;
	// 			aa+=bb;
	// 			console.log(aa);
	// 	}
	// 		function c(){
	// 			var cc=100;
	// 			aa-=cc;
	// 			console.log(aa);
	// 	}
	// 	return [b,c]
	// }
	// var demo=a();
	// demo[0]();
	// demo[1]();


	// a define  [[scope]] --> 0:GO

	// a doing   [[scope]] --> 0:aAO
	// 						   1:GO

	// b define  [[scope]] --> 0:aAO{aa:100,b:fn,...} --->这块作用域会永久保存，会导致内存被占用 可用内存减少 即内存泄漏
	// 						   1:GO

	// b:doing   [[scope]] --> 0:bAO{bb:100}
	// 						   1:aAO{aa:100,b:fn,...}
	// 						   2:GO
	// 						   
	// c:define  [[scope]] --> 0:aAO
	// 						   1:GO
	// 						   
	// c:doing   [[scope]] --> 0:cAO
	// 						   1:aAO
	// 						   2:GO




	//立即执行函数 函数执行后立即释放 格式 1:(function(a,b...){}(参数a,参数b...)) w3c推荐  2: (function (){})()
	//只有表达式才能被执行符号()执行  
	 
	// var num =( function abc(a,b,c){
	// 	return a*b+c*c;
	// }(1322,24,35))
	// console.log(num)

	// var aa=function(){
	// 	console.log(111)
	// }/*前面是函数表达式*/()

	//console.log(abc);
	

	//鄙视题
	// function aaa(a,b,c,d){
	// 	console.log(a+b+c+d)
	// }(1,2,3,4)
	//系统会报错吗？？
	//console.log(aaa)



	// function test (){
	// 	var arr=[];
	// 	for(var i=0;i<10;i++){
	// 		arr[i]=function(){
	// 			document.write(i+' ');
	// 		}
	// 	}
	// 	return arr;
	// }
	// var demo=test();
	// for(var j=0;j<demo.length;j++){
	// 	demo[j]();
	// }
	//函数定义时不会关心函数里面的语句 只有函数执行时才会去关注此时函数内部的变量
	//每个函数都与父函数形成闭包 所以都是操作同一个i变量 arr[i]下标会立即执行
	

	//解决 使用立即执行函数
	// function test (){
	// 	var arr=[];
	// 	for(var i=0;i<10;i++){
	// 		(function(j){
	// 			//j=0,1,2...会立即执行
	// 			arr[j]=function(){
	// 				document.write(j+' ');
	// 			}
	// 		}(i))
	// 	}
	// 	return arr;
	// }
	// var demo=test();
	// for(var j=0;j<demo.length;j++){
	// 	demo[j]();
	// }


	//使用块级作用域
	function test (){
		var arr=[];
		for(let i=0;i<10;i++){
			arr[i]=function(){
				document.write(i+' ');
			}
		}
		return arr;
	}
	var demo=test();
	for(var j=0;j<demo.length;j++){
		demo[j]();
	}
</script>
</html>